這篇文章會介紹使用 Python 的 Pillow 第三方函式庫,將圖片加上 logo 浮水印 ( 使用圖片作為浮水印 ),並嘗試做出半透明的浮水印效果,最後還會搭配 glob 函式庫,實現批次加浮水印的功能。
原文參考:圖片加上 logo 浮水印
- 本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
- 使用 Colab 操作需要連動 Google 雲端硬碟,請參考:連動 Google Drive
輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫。
!pip install Pillow
圖片浮水印是使用一張「背景透明」的圖片作為浮水印,支援背景透明圖片的常見格式有 png、gif、svg,考量支援度與色彩深度,通常會使用 png 的圖片,下方準備了兩張圖,一張是背景照片 photo,一張是作為浮水印的 icon ( 背景透明的愛心 ),可先行下載到電腦中。
載入 Pillow 函式庫的 Image 模組,分別將兩張圖片開啟為 img 和 icon,接著使用 paste 方法,將 icon 貼到 img 上方,存檔後就會看到風景圖上出現愛心的浮水印,paste 方法有三個參數,第一個參數為要貼上的圖片,第二個參數為貼上的座標位置 ( 左上角 ),第三個參數為遮色片,當遮色片與第一個參數為同一張圖,就會採用原圖的 alpha 遮罩設定,因此如果原圖已經是去背的圖片,就會將背景變成透明 ( 如果沒有設定,透明的位置會是全黑或全白 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
img = Image.open('./watermark-photo.jpg') # 開啟風景圖
icon = Image.open('./oxxostudio-icon.png') # 開啟浮水印 icon
img.paste(icon, (0,0), icon) # 將風景圖貼上 icon
img.save('./ok.jpg') # 存檔為 ok.jpg
# img.show() # Colab 不支援直接顯示,如果使用本機環境會開啟圖片檢視器
如果要將 icon 置中,可以透過兩張圖片尺寸的換算,就能計算出置中時 icon 左上角的座標位置。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
img = Image.open('./watermark-photo.jpg')
icon = Image.open('./oxxostudio-icon.png')
img_w, img_h = img.size # 取得風景圖尺寸
icon_w, icon_h = icon.size # 取得 icon 尺寸
x = int((img_w-icon_w)/2) # 計算置中時 icon 左上角的 x 座標
y = int((img_h-icon_h)/2) # 計算置中時 icon 左上角的 y 座標
img.paste(icon, (x, y), icon) # 設定 icon 左上角座標
img.save('./ok.jpg')
同理,只要改變計算的公式,就能將 icon 擺放在右下角的位置。
x = int(img_w-icon_w) # 計算 icon 在右下的 x 座標
y = int(img_h-icon_h) # 計算 icon 在右下的 y 座標
了解加入浮水印的方法後,使用 glob 標準函式庫讀取 demo 資料夾裡所有的 jpg 檔案,就能批次加入浮水印。
- 參考:for 迴圈、拆分字串 split
- 圖片來源:爬取並自動下載 PTT 正妹圖片
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import glob
from PIL import Image
imgs = glob.glob('./demo/*.jpg') # 讀取 demo 資料夾裡所有的圖片
icon = Image.open('./oxxostudio-icon.png')
for i in imgs:
name = i.split('/')[::-1][0] # 取得圖片名稱
img = Image.open(i) # 開啟圖片
img.paste(icon, (0,0), icon) # 加入浮水印
img.save(f'./demo/watermark/{name}') # 以原本的名稱存檔
由於 PIL 裡調整透明度的 putalpha 方法,會調整 RGBA 裡的 A ( alpha ) 色版數值,如果作為浮水印本身是去背的圖片,會造成去背的部分也受到影響 ( 因為去背位置的像素包含了 alpha 資訊 ),因此如果要做到半透明的浮水印,可以先產生一張完全不透明的圖 ( 有浮水印的 ),然後再調整這張圖的透明度,與原本沒有浮水印的圖結合,就會產生半透明的浮水印效果。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
img = Image.open('./watermark-photo.jpg') # 準備合成浮水印的圖
img2 = Image.open('./watermark-photo.jpg') # 底圖
icon = Image.open('./oxxostudio-icon.png')
img_w, img_h = img.size
icon_w, icon_h = icon.size
x = int((img_w-icon_w)/2)
y = int((img_h-icon_h)/2)
img.paste(icon, (x, y), icon) # 合成浮水印
img.convert('RGBA') # 圖片轉換為 RGBA 模式 ( 才能調整 alpha 色版 )
img.putalpha(100) # 調整透明度,範圍 0~255,0 為全透明
img2.paste(img,(0,0),img) # 合成底圖
img2.save('./ok.jpg')
如果要對自己的圖片進行保護,加入浮水印是個不錯的做法,透過這個範例,就能自己做出批次加入浮水印的程式。
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^